package br.com.fogas.webservice.autorizacao;

public class AtendeRequisicao {
	
	public static AuthSOAP atende(WSImplementacao implementacao) {
		POD pod = new POD();
		PID pid = new PID();
		POP pop = new POP();
		PIP pip = new PIP();
		
		pod.setProximo(pid);
		pid.setProximo(pop);
		pop.setProximo(pip);
		
		return pod.atende(implementacao);
	}
	
	private static class PIP extends AtendeAutorizacao {
		@Override
		public AuthSOAP atende(WSImplementacao implementacao) {
			if(AuthFactory.MODO_PRODUCAO && implementacao.equals(WSImplementacao.PI)) {
				return new PIPAuthSOAP();
			} else if(proximo != null) {
				return proximo.atende(implementacao);
			} 
			return null;
		}
	}
	
	private static class POP extends AtendeAutorizacao {

		@Override
		public AuthSOAP atende(WSImplementacao implementacao) {
			if(AuthFactory.MODO_PRODUCAO && implementacao.equals(WSImplementacao.PO)) {
				return new POPAuthSOAP();
			} else if(proximo != null) {
				return proximo.atende(implementacao);
			}
			return null;
		}
	}
	
	private static class PID extends AtendeAutorizacao {
		@Override
		public AuthSOAP atende(WSImplementacao implementacao) {
			if(!AuthFactory.MODO_PRODUCAO && implementacao.equals(WSImplementacao.PI)) {
				return new PIDAuthSOAP();
			} else if(proximo != null) {
				return proximo.atende(implementacao);
			}
			return null;
		}
	}
	
	private static class POD extends AtendeAutorizacao {
		@Override
		public AuthSOAP atende(WSImplementacao implementacao) {
			if(!AuthFactory.MODO_PRODUCAO && implementacao.equals(WSImplementacao.PO)) {
				return new PODAuthSOAP();
			} else if(proximo != null) {
				return proximo.atende(implementacao);
			}
			return null;
		}
	}
}
